Pulumi を利用し、AWSリソースをデプロイするチュートリアルを触ってみた
はじめに
Pulumi AIが利用できるようになり、Pulumiというサービスが気になったので、Pulumiのチュートリアルを触ってみます。
以下の流れで、Pulumiを利用し、AWSにリソースをデプロイします。
- AWSアカウントにアクセスするためのPulumiのセットアップと設定。
- 新しいPulumiプロジェクトを作成する。(yamlを使用)
- 新しいAWS S3バケットをプロビジョニングします。
- バケットにindex.htmlファイルを追加し、静的ウェブサイトとして提供します。
- プロビジョニングしたリソースを破棄して、デプロイメントをクリーンアップします。
事前準備
- AWSのアクセスキーとシークレットキーを取得しておく
Pulumi プロジェクトの作成
Macの場合、Homebrewをインストール済みであれば、terminalに以下のコマンドで Pulumiをインストールします
$ brew install pulumi/tap/pulumi
Pulumi 用のディレクトリを作成後、pulumi new aws-yaml
で、Pulumiのプロジェクトをyamlで作成します。
Pulumiのアカウントを作成していない場合、エンターを押した後、ブラウザに遷移し、アカウント作成をする必要があります。
$ mkdir quickstart && cd quickstart quickstart/ $ pulumi new aws-yaml Manage your Pulumi stacks by logging in. Run `pulumi login --help` for alternative login options. Enter your access token from https://app.pulumi.com/account/tokens or hit <ENTER> to log in using your browser :
ちなみに、pulumi new aws-yaml
を実行する際、実行時内のディレクトリは、空でなければエラーになります
quickstart/ $ error: /xxxx/quickstart is not empty; rerun in an empty directory, pass the path to an empty directory to --dir, or use --force
アカウント作成後、terminalに戻ると、以下の4つを入力することを求められますので、それぞれ入力しました
- プロジェクト名
- quickstart
- プロジェクトの概要文
- Test
- スタック名
- dev
- デプロイしたいリージョン
- ap-northeast-1
今回は、以下を入力しました
project name: (quickstart) quickstart project description: (A minimal AWS Pulumi YAML program) Test Created project 'quickstart' Please enter your desired stack name. To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`). stack name: (dev) dev Created stack 'dev' aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1
作成されたファイル
pulumi new aws-yaml
を実行し作成されたファイルは2つです。
- Pulumi.yaml
- リソースを管理するプロジェクトとプログラムの両方を定義します。
- Pulumi.dev.yaml
- 初期化したばかりのスタックの構成値が含まれています。
name: quickstart runtime: yaml description: Test outputs: # Export the name of the bucket bucketName: ${my-bucket.id} resources: # Create an AWS resource (S3 Bucket) my-bucket: type: aws:s3:Bucket
config: aws:region: ap-northeast-1
Pulumi.yamlのコードの内容は、新しい S3 バケットを作成し、バケットの名前をエクスポートするようです。
スタックをデプロイ
事前に作成したアクセスキーとシークレットキーが設定されていることを確認し、pulumi up
でスタックをデプロイします。
Do you want to perform this update?
と聞かれると以下の3つの選択肢がでますので、yes
を選択します。
- details
- 変更点の差分が表示されます
- yes
- スタックをデプロイします
- no
- 更新操作を実行せずにユーザープロンプトに戻ります
$ aws configure AWS Access Key ID [None]: XXXX AWS Secret Access Key [None]: XXXXXXXX Default region name [None]: ap-northeast-1 Default output format [None]: quickstart/ $ pulumi up Do you want to perform this update? yes Updating (dev) View in Browser (Ctrl+O): https://app.pulumi.com/HiraiYuji/quickstart/dev/updates/3 Type Name Status pulumi:pulumi:Stack quickstart-dev + └─ aws:s3:Bucket my-bucket created (2s) Outputs: + bucketName: "my-bucket-584944b" Resources: + 1 created 1 unchanged Duration: 3s
my-bucket-584944b
というバケット名で作成されました
Outputsの内容は、下記コマンドで確認できます。
quickstart/ $ pulumi stack output bucketName my-bucket-584944b
スタックの変更
スタックを変更します。
まず、S3バケットに追加するindex.htmlを追加します。
quickstart/ $ echo '<html> <body> <h1>Hello, Pulumi!</h1> </body> </html>' > index.html
index.htmlをS3バケットに追加するためには、PulumiのFileAssetリソースを使用します
Pulumi.yamlファイルを以下に書き換えます。
name: quickstart runtime: yaml description: Test resources: my-bucket: type: aws:s3:Bucket index.html: type: aws:s3:BucketObject properties: bucket: ${my-bucket} source: fn::fileAsset: ./index.html outputs: bucketName: ${my-bucket.id}
このバケットオブジェクトは、バケットオブジェクトのプロパティでバケット名を参照しているため(14行目)、先程デプロイしたBucketの一部となります。
次に、変更した内容をデプロイします。
quickstart/ $ pulumi up
indexl.htmlが追加されていました。
quickstart/ $ aws s3 ls $(pulumi stack output bucketName) 2023-04-23 11:50:33 70 index.html
静的ウェブサイトに変更
インターネット上でアクセスできるようにするための調整を行います。
Pulumi.yamlファイルを以下に書き換えます。
name: quickstart runtime: yaml description: A minimal AWS Pulumi YAML program resources: my-bucket: type: aws:s3:Bucket properties: website: indexDocument: index.html ownership-controls: type: aws:s3:BucketOwnershipControls properties: bucket: ${my-bucket.id} rule: objectOwnership: ObjectWriter public-access-block: type: aws:s3:BucketPublicAccessBlock properties: bucket: ${my-bucket.id} blockPublicAcls: false index.html: type: aws:s3:BucketObject properties: bucket: ${my-bucket.id} source: fn::fileAsset: ./index.html contentType: text/html acl: public-read options: dependsOn: - ${public-access-block} outputs: bucketName: ${my-bucket.id} bucketEndpoint: http://${my-bucket.websiteEndpoint}
デプロイし、アクセスすると、index.htmlがレスポンスされることを確認できました!
quickstart/ $ pulumi up quickstart/ $ curl $(pulumi stack output bucketEndpoint) <html> <body> <h1>Hello, Pulumi!</h1> </body> </html>
スタックを削除する
スタックを下記コマンドで削除できる
quickstart/ $ pulumi destroy
バケットは、削除されました。
スタック内のリソースは削除されましたが、スタックに関連付けられた履歴と構成は引き続き維持されます。
スタックを完全に削除したい場合は、pulumi stack rm dev
を実行します。
quickstart/ $ pulumi stack rm dev This will permanently remove the 'dev' stack! Please confirm that this is what you'd like to do by typing `dev`: dev Stack 'dev' has been removed!
最後に
チュートリアルの説明通りに進めることで、特に詰まることなくデプロイまで体験することができました。
次は、Pulumi AIを触ってみたいと思います!
Pulumi AIを試したブログを作成しました。興味があれば一読ください、